﻿using Abp.Domain.Repositories;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Abp.AutoMapper;
using System.Threading.Tasks;

namespace MyCompanyName.AbpZeroTemplate.Prm.Admin
{
    public class MailDefinedAppService : AbpZeroTemplateAppServiceBase, IMailDefinedAppService
    {
        private IRepository<MailDefined> _mailDefinedRepository;
        private IRepository<MailRecord> _mailRecordRepository;

        public MailDefinedAppService(IRepository<MailDefined> mailDefinedRepository, IRepository<MailRecord> mailRecordRepository)
        {
            _mailDefinedRepository = mailDefinedRepository;
            _mailRecordRepository = mailRecordRepository;
        }

        public List<KeyValuePair<string, int>> GetMailCategory()
        {
            List<KeyValuePair<string, int>> result = new List<KeyValuePair<string, int>>();
            foreach (var item in Enum.GetValues(typeof(MyCompanyName.AbpZeroTemplate.Prm.Admin.MailCatelog)))
            {
                result.Add(new KeyValuePair<string, int>(item.ToString(), (int)item));
            }
            return result;
        }


        public Dto.GetMailDefinedOutPut GetMail(MailCatelog category)
        {
            var mail = _mailDefinedRepository.GetAll().Where(x => x.KeyCatelog == category).SingleOrDefault();
            if (mail == null)
            {
                mail = InitMailBy(category);
            }
            var model = mail.MapTo<Dto.GetMailDefinedOutPut>();
            return model;
        }

        private MailDefined InitMailBy(MailCatelog category)
        {
            var mail = new MailDefined()
            {
                KeyCatelog = (MailCatelog)category,
                Subject = category.ToString(),
                Body = string.Empty,
                Priority = System.Net.Mail.MailPriority.Normal,
                Notes = string.Empty,
                ProjectRoles = "",
                SystemRoles = "",
                Receivers = "",
                OptScope = Prm.Authorization.ActionScope.all
            };

            switch (category)
            {
                case MailCatelog.文档上传:
                    mail.Subject = "【[项目名称] - [项目编号]】上传了新文档";
                    mail.Body = " [操作人] 在 [操作时间] 上传了该项目  [文档类别] 中的文档： [文档名称]";
                    break;
                case MailCatelog.项目问题提问:
                    mail.Subject = "【[项目名称] - [项目编号]】遇到新的问题【 [标题]】";
                    mail.Body = " [操作人] 在 [操作时间] 提问了该项目 \r\n 标题:[标题] \r\n 内容:\r\n[内容]";
                    break;
                case MailCatelog.项目问题解答:
                    mail.Subject = "【[项目名称] - [项目编号]】的问题【[标题]】有最新消息";
                    mail.Body = " [操作人] 在 [操作时间] 回答了问题  【[标题]】\r\n 内容:\r\n[内容]\r\n 回答:\r\n[回答]";
                    break;
                case MailCatelog.项目状态变更:
                    mail.Subject = "【[项目名称] - [项目编号]】修改状态为 【[当前状态]】";
                    mail.Body = " [操作人] 在 [操作时间] 修改了项目状态信息。\r\n状态： 【[之前状态]】->  【[当前状态]】 \r\n进度： 【[之前进度]】->  【[当前进度]】\r\n预期完成日期： 【[之前预期完成]】->  【[当前预期完成]】\r\n备注： [描述]";
                    break;
                case MailCatelog.申请查看项目:
                    mail.Subject = "[操作人]申请查看项目【[项目名称] - [项目编号]】";
                    mail.Body = "申请项目：【[项目名称] - [项目编号]】\r\n 申请时间：[生效时间] - [失效时间]\r\n 申请说明：[申请说明]";
                    break;
                case MailCatelog.申请查看项目通过:
                    mail.Subject = "通过 [申请人]查看项目 【[项目名称] - [项目编号]】[生效时间] - [失效时间]";
                    mail.Body = " [操作人] 在 [操作时间] 允许 [申请人]查看项目 【[项目名称] - [项目编号]】[生效时间] - [失效时间]\r\n 审核说明：[审核说明]";
                    break;
                case MailCatelog.申请查看项目驳回:
                    mail.Subject = "驳回 [申请人]查看项目 【[项目名称] - [项目编号]】";
                    mail.Body = " [操作人] 在 [操作时间] 驳回了 [申请人]查看项目 【[项目名称] - [项目编号]】 \r\n 审核说明：[审核说明]";
                    break;
                case MailCatelog.新增项目通知:
                    mail.Subject = "新增项目 【[项目名称] - [项目编号]】";
                    mail.Body = " [操作人] 在 [操作时间] 新增项目 【[项目名称] - [项目编号]】 项目经理是 [项目经理]";
                    break;
                case MailCatelog.询盘评估提醒:
                    mail.Subject = "询盘评估提醒";
                    mail.Body = " 您有 [询盘数量]条 需要提供技术评估。<br>[询盘明细]";
                    break;

                case MailCatelog.询盘评估完成提醒:
                    mail.Subject = "询盘评估完成提醒";
                    mail.Body = "九洲代号： [九洲代号] 已完成评估。";
                    break;
                case MailCatelog.询盘任务下达提醒:
                    mail.Subject = "询盘任务下达提醒";
                    mail.Body = "新任务书已下达，代号：[九洲代号] ";
                    break;

                case MailCatelog.项目任务更新通知:
                    mail.Subject = "项目任务更新通知";
                    mail.Body = " 与您相关的任务有更新了:<br>[问题]";
                    break;
                case MailCatelog.项目任务完成通知:
                    mail.Subject = "项目任务完成通知";
                    mail.Body = " 与您相关的任务标示完成了:<br>[问题]";
                    break;



                case MailCatelog.项目任务到期未归档通知:
                    mail.Subject = "[项目编号]有[待归档任务数]个任务需要进行归档";
                    mail.Body = " 任务明细:<br>[待归档任务明细]";
                    break;
                case MailCatelog.项目计划开始通知:
                    mail.Subject = "项目计划开始通知";
                    mail.Body = " 应该开始的计划:<br>[将开始计划明细]";
                    break;
                case MailCatelog.项目阶段计划完成提醒:
                    mail.Subject = "项目[项目编号]阶段进展计划完成提醒";
                    mail.Body = "应完成的阶段进展 :<br>[待完成阶段]";
                    break;
                case MailCatelog.项目计划到期未完成通知:
                    mail.Subject = "项目任务完成通知";
                    mail.Body = " 应该完成的计划:<br>[应该完成计划明细]";
                    break;
                case MailCatelog.项目周报完成情况:
                    mail.Subject = "项目[项目编号]周报完成情况";
                    mail.Body = "[明细]";
                    break;
                case MailCatelog.项目报告提交提醒:
                    mail.Subject = "项目[项目编号]有N份报告需要完成";
                    mail.Body = "[报告内容]";
                    break;
                case MailCatelog.项目进展公告:
                    mail.Subject = "第[周]周 项目进展列表";
                    mail.Body = "[明细]";
                    break;
                case MailCatelog.个人未提交周报提醒:
                    mail.Subject = "您还有[待提交数]份 周报需要补齐";
                    mail.Body = "[明细]";
                    break;
                default:
                    break;
            }



            var id = _mailDefinedRepository.InsertAndGetId(mail);
            return _mailDefinedRepository.Get(id);

        }



        public async Task UpdateMailDefined(Dto.UpdateMailDefinedInPut input)
        {
            var mail = await _mailDefinedRepository.GetAsync(input.Id);
            mail.OptScope = input.OptScope;
            mail.Body = input.Body;
            mail.Notes = input.Notes;
            mail.Priority = input.Priority;
            if (input.ProjectRoles != null)
            { mail.ProjectRoles = string.Join(",", input.ProjectRoles); }
            mail.Receivers = input.Receivers;
            mail.Subject = input.Subject;
            if (input.SystemRoles != null)
            { mail.SystemRoles = string.Join(",", input.SystemRoles); }
        }


        public async Task SetMailReceiver(List<KeyValuePair<int, string>> updates)
        {
            foreach (var item in updates)
            {
                var mail = await _mailRecordRepository.GetAsync(item.Key);
                mail.Receivers = item.Value;
            }
        }
    }
}
